<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

/**
@ingroup CP_DONNEES
@nosubgrouping
@brief Actions sur une catégorie

Une instance de cpCategorie représente une catégorie du site.

Ses variables membres permettent d'accéder à toutes les données de la catégorie
issues de la base de données.

Ses méthodes permettent, entre autres, d'effectuer les actions suivantes:
- Obtenir les catégories parents et enfants
- Obtenir les pages enfants
- Modifier la catégorie
- Supprimer la catégorie et tous ses enfants

*/

class cpCategorie
{
	
	
	
	
	
	protected $core;	///< <b>cpCore</b>		Référence à l'objet cpCore de l'application
	
	public $cat_id;
	public $parent_cat_id;
	public $cat_url;
	public $cat_titre;
	public $home_page_id;
	
	
	
	
	
	/// @name Initialisation et mise à jour des valeurs
	//@{
	
	
	/**
	Initialise une instance de cpCategorie.
	
	@param	rs			<b>recordset</b>	Données de la base de données
	@param	core		<b>cpCore</b>		Référence à cpCore
	*/
	public function __construct($rs, $core)
	{
		$this->core =& $core;
		$this->initRs($rs);
	}
	
	
	/** @ignore */
	public function initRs($rs)
	{
		
		$this->cat_id = $rs->cat_id;
		$this->parent_cat_id = $rs->parent_cat_id;
		$this->cat_url = $rs->cat_url;
		$this->cat_titre = $rs->cat_titre;
		$this->home_page_id = $rs->home_page_id;

		# --COMPORTEMENT-- coreInitRsCategorie
		$this->core->executerComportement('coreInitRsCategorie', $rs, $this);
		
	}
	
	
	/**
	Met à jour les valeurs de cpPage pour qu'elles correspondent à
	celles de la base de données.
	
	Doit être appelée chaque fois qu'on modifie les données de la page
	dans la base de données.
	*/
	public function rafraichir()
	{
		$rs = $this->core->site->getCategories(array('cat_id' => $this->cat_id), CP_GET_RS);
		$this->initRs($rs);
	}
	//@}
	
	
	
	
	
	/// @name Obtenir des informations
	//@{
	
	
	/**
	Retourne la catégorie directement parente.
	
	@return	<b>cpCategorie</b>
	*/
	public function getParent()
	{
		if($this->cat_id == 1) {
			return NULL;
		}
		
		return $this->core->site->getCategories(array('cat_id' => (integer) $this->parent_cat_id), CP_GET_STATIC);
	}
	
	
	/**
	Retourne un tableau contenant toutes les catégories
	parentes ordonnées.
	
	@return	<b>array</b>	Tableau d'instances de cpCategorie
	*/
	public function getArborescence()
	{

		$arborescence = array();
	
		$catActuelle = $this;
	
		while($catActuelle->cat_id != 1)
		{
			$catActuelle = $catActuelle->getParent();	
			$arborescence[] = $catActuelle;
		}
	
		return array_reverse($arborescence);
	
	}
	
	
	/**
	Retourne un tableau contenant toutes les catégories
	enfant (pas nécessairement directement).
	
	@return	<b>array</b>	Tableau d'instances de cpCategorie
	*/
	public function getEnfants()
	{
		
		$enfants = array($this->cat_id);
		
		$rs = $this->core->site->getCategories(array('parent_cat_id' => $this->cat_id), CP_GET_STATIC);
		
		while($rs->fetch()) {
			$enfants = array_merge($enfants, $rs->getEnfants());
		}
		
		return $enfants;
		
	}
	
	
	/**
	Retourne les catégories directement enfants.
	
	@return	<b>recordset</b>	Catégories
	*/
	public function getCategories($params=array(), $type=CP_GET_RS)
	{
		$params['parent_cat_id'] = (integer) $this->cat_id;
		return $this->core->site->getCategories($params, $type);	
	}
	
	
	/**
	Retourne les pages directement enfants.
	
	@return	<b>recordset</b>	Pages
	*/
	public function getPages($params=array(), $type=CP_GET_RS)
	{
		$params['cat_id'] = (integer) $this->cat_id;
		return $this->core->site->getPages($params, $type);
	}
	//@}
	
	
	/// @name Actions
	//@{
	
	
	/**
	Supprime la catégorie, les catégories enfants et les
	pages enfants.
	*/
	public function supprimer()
	{
		
		if($this->cat_id == 1) {
			throw new cpErreur(__('Action non autorisée'), null, 303);
		}
		
		# --COMPORTEMENT-- coreAvantSupprimerCategorie
		$this->core->executerComportement('coreAvantSupprimerCategorie', $this);
		
		$sousCategories = $this->getCategories(array(), CP_GET_STATIC);
		
		while($sousCategories->fetch()) {
			$sousCategories->supprimer();
		}
		
		$strReq = 'DELETE FROM '.$this->core->prefix.'temp_pages WHERE cat_id = '.(integer) $this->cat_id;
		$this->core->con->execute($strReq);
		
		$strReq = 'DELETE FROM '.$this->core->prefix.'pub_pages WHERE cat_id = '.(integer) $this->cat_id;
		$this->core->con->execute($strReq);
		
		$strReq = 'DELETE FROM '.$this->core->prefix.'categories WHERE cat_id = '.(integer) $this->cat_id;
		$this->core->con->execute($strReq);
		
		# --COMPORTEMENT-- coreApresSupprimerCategorie
		$this->core->executerComportement('coreApresSupprimerCategorie', $this);
		
	}

	
	/**
	Modifie les propriétés de la catégorie.
	
	@param	cur		<b>cursor</b>
	*/
	public function enregistrer($cur)
	{
		
		$this->core->site->verifierDonneesCategorie($cur, false, $this->cat_id);
		
		# --COMPORTEMENT-- coreAvantEnregistrerCategorie
		$this->core->executerComportement('coreAvantEnregistrerCategorie', $cur, $this);
		
		$cur->update("WHERE cat_id = ".(integer) $this->cat_id);
		
		# --COMPORTEMENT-- coreApresEnregistrerCategorie
		$this->core->executerComportement('coreApresEnregistrerCategorie', $cur, $this);
		
		$this->rafraichir();
		
	}
	//@}

	
}

?>